#include <limits>

namespace Rz {

template <typename T>
struct NumericLimits
{
	static const bool IsSpecialized			= std::numeric_limits<T>::is_specialized;
	static T Min()							{ return std::numeric_limits<T>::min(); }
	static T Max()							{ return std::numeric_limits<T>::max(); }
	static const int  Digits				= std::numeric_limits<T>::digits;
	static const int  Digits10				= std::numeric_limits<T>::digits10;
	static const bool IsSigned				= std::numeric_limits<T>::is_signed;
	static const bool IsInteger				= std::numeric_limits<T>::is_integer;
	static const bool IsExact				= std::numeric_limits<T>::is_exact;
	static const int Radix					= std::numeric_limits<T>::radix;
	static T Epsilon()						{ return std::numeric_limits<T>::epsilon(); }
	static T RoundError()					{ return std::numeric_limits<T>::round_error(); }

	static const int  MinExponent			= std::numeric_limits<T>::min_exponent;
	static const int  MinExponent10			= std::numeric_limits<T>::min_exponent10;
	static const int  MaxExponent			= std::numeric_limits<T>::max_exponent;
	static const int  MaxExponent10			= std::numeric_limits<T>::max_exponent10;

	static const bool HasInfinity			= std::numeric_limits<T>::has_infinity;
	static const bool HasQuietNaN			= std::numeric_limits<T>::has_quiet_NaN;
	static const bool HasSignalingNaN		= std::numeric_limits<T>::has_signaling_NaN;
	static const bool HasDenormLoss			= std::numeric_limits<T>::has_denorm_loss;
	static T Infinity()						{ return std::numeric_limits<T>::infinity(); }
	static T QuietNaN()						{ return std::numeric_limits<T>::quiet_NaN(); }
	static T SignalingNaN()					{ return std::numeric_limits<T>::signaling_NaN(); }
	static T DenormMin()					{ return std::numeric_limits<T>::denorm_min(); }

	static const bool IsIec559				= std::numeric_limits<T>::is_iec559;
	static const bool IsBounded				= std::numeric_limits<T>::is_bounded;
	static const bool IsModulo				= std::numeric_limits<T>::is_modulo;

	static const bool Traps					= std::numeric_limits<T>::traps;
	static const bool TinynessBefore		= std::numeric_limits<T>::tinyness_before;
};

}
